package com.bocom.hairy.crab.consumer.config;

import com.bocom.hairy.crab.consumer.interceptor.CustomResponseErrorHandler;
import com.bocom.hairy.crab.consumer.interceptor.HeaderInterceptor;
import com.bocom.hairy.crab.consumer.interceptor.LoggingInterceptor;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
 * @ClassName com.bocom.hairy.crab.consumer.config.RestTemplateConfig <br/>
 * @Description: RestTemplate配置   <br/>
 * @Author jiangshikun             <br/>
 * @Date 2025/9/4 上午11:01         <br/>
 * @Version V1.0
 * ----------------------------------------
 * （^-^）心即理，知行合--致良知 （^-^）
 * 邮 箱:duzhuai@live.cn
 * 地 址：北京市海淀区永澄北路2号
 **/

import jakarta.annotation.Resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.DefaultUriBuilderFactory;

import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.List;

/**
 * Spring Boot 3 专用 RestTemplate 配置
 * 适配Jakarta EE，优化连接池和超时策略
 */
@Configuration
public class RestTemplateConfig {

    @Resource
    private HttpClientPoolConfig httpClientPoolConfig; // 连接池配置

    /**
     * 核心配置：构建高性能RestTemplate
     */
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory requestFactory) {
        RestTemplate restTemplate = new RestTemplate(requestFactory);

        // 1. 解决URL编码问题（中文/特殊字符）
        DefaultUriBuilderFactory uriFactory = new DefaultUriBuilderFactory();
        uriFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY); // 仅编码参数值
        restTemplate.setUriTemplateHandler(uriFactory);

        // 2. 强制JSON消息转换器使用UTF-8（解决中文乱码）
        List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
        converters.forEach(converter -> {
            if (converter instanceof MappingJackson2HttpMessageConverter jacksonConverter) {
                jacksonConverter.setDefaultCharset(StandardCharsets.UTF_8);
            }
        });

        // 3. 添加拦截器（日志、统一Header等）
        restTemplate.setInterceptors(List.of(
                new LoggingInterceptor(), // 日志拦截器
                new HeaderInterceptor()   // 统一Header拦截器（如添加Token）
        ));

        // 4. 自定义错误处理器（将HTTP错误转为业务异常）
        restTemplate.setErrorHandler(new CustomResponseErrorHandler());

        return restTemplate;
    }

    /**
     * 配置HTTP连接工厂（基于HttpClient 5，Spring Boot 3推荐）
     */
    @Bean
    public ClientHttpRequestFactory clientHttpRequestFactory() {
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();

        // 配置HttpClient连接池（复用连接，提升性能）
        factory.setHttpClient(httpClientPoolConfig.createHttpClient());

        // 超时配置（Spring 6+推荐使用Duration）
        factory.setConnectTimeout(Duration.ofSeconds(3));    // 连接超时：3秒
        //factory.setReadTimeout(Duration.ofSeconds(10));     // 读取超时：10秒
        factory.setConnectionRequestTimeout(Duration.ofSeconds(2)); // 连接池等待超时：2秒

        return factory;
    }
}



